package com.ntd.study.base.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 线程学习类
 * 线程实现的三种方式
 * 线程状态
 * |-- new 新建状态
 * |-- Runnable 可运行状态
 * |-- Blocking 阻塞状态 - 等待释放锁的状态
 * |-- Waiting 等待、及时状态
 * |-- Stop 终止状态
 * |-- Running 运行中状态 - 当前正在运行
 * 如何停止一个线程
 * |-- run方法执行完成
 * |-- 线程运行时抛出一个未捕获的异常
 * |-- 通过标志位跳出
 * |-- Interrupt() 像需要停止的线程发送终止指令，是否中断，由CPU决定
 * 线程安全：多个线程同时运行，始终能够正确运行出结果，就是线程安全的。
 */
public class DemoThread {
    static class Dthread1 extends Thread { // 线程实现方式1
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + "线程实现第一种方式");
        }
    }

    static class Dthread2 implements Runnable { // 线程实现方式2
        public void run() {
            System.out.println(Thread.currentThread().getName() + "线程实现第二种方式");
        }
    }

    //创建一个Callable，3秒后返回String类型
    static final FutureTask futureTask = new FutureTask<>((Callable) () -> { // 线程实现方式3
        System.out.println(Thread.currentThread().getName() + "线程实现第三种方式");
        Thread.sleep(3000);
        return "call方法返回值";
    });


    public static void main(String[] args) throws Exception {
        new Dthread1().start();
        new Thread(new Dthread2()).start();
        new Thread(futureTask).start();
        System.out.println(futureTask.get());
    }
}
